package com.study.concurrent.B_ThreadSynchronizedBasic.g_UpdateBalanceOfLock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Created by 赵超 on 2017/3/22.
 * 打印队列
 */
public class PrintQueue {
    /**
     * 创建锁对象并将fair属性设置为true，
     * fair属性用于设置锁的模式
     * fair=true，会采用公平模式，当有很多线程等待锁时，会选择等待时间最长的一个线程进入隔离区
     * 默认为fair=false，即非公平模式，当有很多线程等待锁时，会随机选择一个线程进入隔离区
     */
    private final Lock queueLock = new ReentrantLock(true);

    /**
     * 模拟文档打印
     *
     * @param document
     */
    public void printJob(Object document) {
        queueLock.lock();
        try {
            Long duration = (long) (Math.random() * 10000);
            System.out.printf("%s : 打印队列 执行打印任务 周期为%d秒 文档 : %s\n",
                    Thread.currentThread().getName(), duration / 1000, document.toString());
            Thread.sleep(duration);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            queueLock.unlock();
        }

        queueLock.lock();
        try {
            Long duration = (long) (Math.random() * 10000);
            System.out.printf("%s : 打印队列 执行打印任务 周期为%d秒 文档 : %s\n",
                    Thread.currentThread().getName(), duration / 1000, document.toString());
            Thread.sleep(duration);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            queueLock.unlock();
        }
    }

}
